/**
 * @file Client.hpp
 * @brief 提供对旧框架的兼容
 * @note
 * ## 配置文件
 * 检测路径:`/etc/supermatrix/OldClient.conf`
 * **示例**
 * ```
 * /Record
 * 127.0.0.1
 * 7600
 * OldClient_test
 * ```
 * **描述**
 * 名称 | 类型 
 * ---- | ---- 
 * 保存路径 | string
 * 服务器IP | string
 * 端口号 | long
 * 设备名称 | string
 * 
 */

#ifndef CLIENT_H
#define CLIENT_H
#include <string>
#include <thread>
#include "ImageStream.hpp"
#include "PixelFormat.hpp"

/**
 * @brief 定义设备状态（用于网络传输）
 */
enum class DeviceStatus:int32_t
{
    UnInit=0x1,     ///< 未初始化状态
    Init=0x3,       ///< 设备就绪
    CameraShot=0x4, ///< 正在拍摄
    CmaeraSave=0x5, ///< 正在采集
    Error=0x0       ///< 错误
};

/**
 * @class Client
 * @brief 为RemoteHandle准备的接口，以及对接主程序
 */
class Client
{
    private:
      /**
       * @brief 图像采集线程
       */
      std::jthread imagethread;
      /**
       * @brief 图像获取模块
       */
      ImageStream* stream=nullptr;
      /**
       * @brief 当前图像高度
       */
      long imgHeight;
      /**
       * @brief 当前图像宽度
       */
      long imgWidth;
      unsigned char* ImgBuffer=nullptr;
    public:
        /**
         * @brief 构造函数
         * @exception std::runtime_error 无法初始化内部对象
         */
        Client();
        /**
         * @brief 析构函数
         */
        virtual ~Client();
        /**
         * @brief 启动程序
         * @note 堵塞函数，直到网络连接断开
         */
        void Run();
        /**
         * @brief 发送错误消息
         *
         * @param msg 消息内容
         */
        void sendErrorMessage(std::string msg);
        /**
         * @brief 发送预览图像
         *
         * @param imageData 图像数据
         * @param imageHeight 图像高度
         * @param imageWidth 图像宽度
         * @param imageFormat 图像格式（这里固定为MONO8）
         */
        void sendPreviewImage(unsigned char* imageData,const int32_t imageHeight,const int32_t imageWidth,const pixelFormat imageFormat);
        /**
         * @brief 获取设备状态(具体格式参见DeviceStatus)
         */
        void GetDeviceStatus();
        /**
         * @brief 获取相机参数
         */
        void GetCameraParameter();
        /**
         * @brief 初始化设备
         */
        void InitDevice();
        /**
         * @brief 开始拍摄
         * @exception std::logic_error ImageStream提供的缓冲区大小过小
         */
        void StartShot();
        /**
         * @brief 开始存图
         */
        void StartSave();
        /**
         * @brief 停止拍摄
         */
        void StopShot();
        /**
         * @brief 停止存图
         */
        void StopSave();
        /**
         * @brief 开始触发
         */
        void StartTrigger();
        /**
         * @brief 停止触发
         */
        void StopTrigger();
        /**
         * @brief 设置图像宽度(ROI)
         *
         * @param value 图像宽度
         */
        void SetImageWidth(int32_t value);
        /**
         * @brief 设置图像高度(ROI)
         *
         * @param value 图像高度
         */
        void SetImageHeight(int32_t value);
        /**
         * @brief 设置图像X偏移
         *
         * @param value X偏移量
         */
        void SetImageOffsetX(int32_t value);
        /**
         * @brief 设置图像Y偏移
         *
         * @param value Y偏移量
         */
        void SetImageOffsetY(int32_t value);
        /**
         * @brief 设置曝光时间
         *
         * @param value 曝光时间
         */
        void SetExposureTime(int32_t value);
        /**
         * @brief 设置帧率
         *
         * @param value 帧率
         */
        void SetFrameRate(int32_t value);
        /**
         * @brief 文件传输接口
         * @deprecated 已弃用，只是兼容老接口
         */
        [[deprecated]]
        void FileTranslate();
};

#endif
